#if !defined(__THREAD_POOL_H__)  
#define __THREAD_POOL_H__  
  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <memory.h>  
#include <pthread.h>  
#include <sys/types.h>  

#include "queue.h"
  
// 布尔类型  
typedef int bool;  
#define false (0)  
#define true  (1)  

typedef struct Message
{
    struct sockaddr_in client;      // 客户端信息，标识唯一连接
   // int flag;                       // 请求码，what are you doing?
    MSG msg;                    // 消息体
}Elem;
  
/* 线程任务链表 */  
typedef struct _thread_worker_t  
{  
    void *(*process)(Elem *arg);  /* 线程处理的任务 */  
    Elem *elem                /* 任务接口参数 */  
    struct _thread_worker_t *next;/* 下一个节点 */  
}thread_worker_t;  
  
/* 线程池对象 */  
typedef struct  
{  
    pthread_mutex_t queue_lock;   /* 队列互斥锁 */  
    pthread_cond_t queue_ready;   /* 队列条件锁 */  
  
    thread_worker_t *head;        /* 任务队列头指针 */  
    bool isdestroy;               /* 是否已销毁线程 */  
    pthread_t *threadid;          /* 线程ID数组 —动态分配空间 */  
    int reqnum;                   /* 请求创建的线程个数 */  
    int num;                      /* 实际创建的线程个数 */  
    int queue_size;               /* 工作队列当前大小 */  
}thread_pool_t;  
  
/* 函数声明 */  
extern int thread_pool_init(thread_pool_t **pool, int num);  
extern int thread_pool_add_worker(thread_pool_t *pool, void *(*process)(void *arg), void *arg);  
extern int thread_pool_keepalive(thread_pool_t *pool);  
extern int thread_pool_destroy(thread_pool_t *pool);  
  
#endif /*__THREAD_POOL_H__*/  